/*
 * 文件说明: Mock 模拟登录验证后台数据
 * @author: 无所谓 yagqfhd@qq.com
 * @since: 2023-12-25
 * @file: auth.ts
 * @version: 0.0.1
 * 
 **/

import { authUrl } from '@/apis/api-url'
import { MockMethod } from "vite-plugin-mock"
import { generateToken, findMapKeyByValue } from './utils'
import { users as authUsers, roles as authRoles, userRoleRelationship as authUserRoles } from "./datas"
import { TMock } from "./typings/mock"


// 记录用户Token信息
const authTokes: Map<string, TToken.Token> = new Map()


const mockMethods: MockMethod[] = [
    // 用户登录API后台 
    {
        url: authUrl.login,
        method: 'post',
        response: ({ body }: TMock.Req<TAuth.LoginParams>):TMock.Res<TAuth.LoginResult> => {
            // @ts-ignore 查询用户根据用户名，密码
            const user = authUsers.find(item => item.username === body.username && item.password === body.password)
            // 如果么有找到符合的用户，返回的是 undefine
            if (user) {
                // 创建新的Token
                const token: TToken.Token = {
                    access_token: generateToken(),
                    expires_in: 60 * 60 * 2,
                    refresh_token: generateToken(),
                }
                // 记录用户Token
                authTokes.set(user.username, token)
                // 返回成功数据，这里成功返回的主要是生成的Token
                return { status: 0, statusText: '登录成功', data: token }
            }
            return { status: 1, statusText: '用户名或密码错误' }
        }
    },
    // 后台退出登录
    {
        url: authUrl.logout,
        method: 'post',
        response: ({ headers }: TMock.Req<null>):TMock.Res<TAuth.LogoutResult> => {
            // 获取请求头中保存的Token信息
            const token = headers['x-access-token'] ?? headers['authorization'] ?? headers['token'] ?? ''
            // console.log(token,authTokes)
            // 根据Token信息获取用户名
            const username = findMapKeyByValue(authTokes, (t) => {
                return t.access_token === token
            })
            // 用户名存在
            if (username) {
                // 删除用户名的Token信息
                authTokes.delete(username)
                
                // 返回成功信息
                return { status: 0, statusText: '退出成功' }
            }
            // 错误返回
            // new Error('退出错误, 后台错误'))
            return { status: 1, statusText: '退出错误, 后台错误' } 
        },
    },
    // 刷新Token
    {
        url: authUrl.refreshToken,
        method: 'post',
        response: ({ body }: TMock.Req<TAuth.RefreshTokenParams>): TMock.Res<TAuth.RefreshTokenResult> => {
            // 从Body中获取刷新Token
            const { refresh_token } = body
            // 从token存储中获取用户名
            const username = findMapKeyByValue(authTokes, (t) => {
                return t.refresh_token === refresh_token.refresh_token
            })
            // 存在用户
            if (username) {
                // 重新生成新的Token
                const token: TToken.Token = {
                    access_token: generateToken(),
                    expires_in: 60 * 60 * 2,
                    refresh_token: refresh_token.refresh_token,
                }
                // 更新Token存储信息
                authTokes.set(username, token)
                // 成功返回新的Token
                return { status: 0, statusText: '刷新成功', data: token } 
            }
            // 错误返回
            return { status: 1, statusText: '刷新失败' } 
        }
    },
    // 获取登录用户信息
    {
        url: authUrl.getUserInfo,
        method: 'get',
        response: ({ headers }: TMock.Req<TAuth.GetUsrInfoParams>): TMock.Res<TAuth.GetUserInfoResult> => {
            // 获取token信息从访问 headers 中
            const token = headers['x-access-token'] ?? headers['authorization'] ?? headers['token'] ?? ''
            // console.log(token)
            // 查询用户名根据Token值
            const username = findMapKeyByValue(authTokes, (t) => {
                return t.access_token === token
            })
            // 存在用户
            if (username) {
                // 查询用户信息
                const userInfo = authUsers.find((u) => u.username === username)
                // 存在用户信息
                if (userInfo) {
                    // 返回成功
                    return { status: 0, statusText: '获取成功', data: userInfo } 
                }
            }
            // 返回错误
            return { status: 1, statusText: '获取失败' } 
        },
    },
    // 获取用户角色
    {
        url: authUrl.getUserRoles,
        method: 'get',
        response: ({ headers }: TMock.Req<TAuth.GetUserRolesParams>): TMock.Res<TAuth.GetUserRolesResult> => {
            // 获取token信息从访问 headers 中
            const token = headers['x-access-token'] ?? headers['authorization'] ?? headers['token'] ?? ''
            // 查询用户名
            const username = findMapKeyByValue(authTokes, (t) => {
                return t.access_token === token
            })
            // 存在用户名
            if (username) {
                // 获取用户名对应用户
                const user = authUsers.find(u => u.username === username)
                // 存在用户
                if (user) {
                    // 获取用户角色关系
                    const userRoles = authUserRoles.filter((ur) => ur.userid === user.id) ?? []
                    // 根据关系获取角色ID数组
                    const roleIds = userRoles.map((ur) => ur.roleid)
                    // 筛选符合标志的角色
                    const roles = authRoles.filter((r) => roleIds.includes(r.id))
                    // 返回成功数据
                    return { status: 0, statusText: '成功', data: roles } 
                }
            }
            return { status: 2, statusText: '获取失败' }
        }
    }
]

export default mockMethods